Cargar librerías, funciones, datos

Con esta línea de código cargamos todas las librerías, funciones y datos necesarios para esta práctica.

Cargar función

source("funciones.R")

Ver función

# Función para cargar e instalar librerías
cargar_librerias <- function(librerias) {
  sapply(librerias, function(lib) {
    
    # Cargar la librería, y si no existe instalar y cargar.
    if(!require(lib, character.only = TRUE)) {
      
      # Instalar paquete
      install.packages(lib)
      
      # Cargar librería
      library(lib, character.only = TRUE)
    }
  })}

librerias <- c(
  'data.table',
  'tidyverse',
  'lubridate',
  'reactable')

cargar_librerias(librerias)

Leer archivos

Leemos todos los archivos contenidos en el directorio data y el resultado es una la lista con todos nuestros dataframes.

Cargar función

fun_leer_archivos("data")

Ver función

# Adquisición y preparación del dato

fun_leer_archivos <- function(carpeta_datos){

  # Leer archivos de el directorio data
  mis_tablas <<- list.files(carpeta_datos)
  
  # Nombre de las tablas sin el csv
  nombre_tablas <<- gsub(".csv", "", mis_tablas)
  
  # Número de tablas
  n_archivos <<- length(mis_tablas)
  
  # Ruta del completa de cada archivo
  mis_tablas_path <<- paste0(getwd(), "/data/", list.files("data"))
  
  # creo una lista con totdas las tablas
  lista_de_tablas <<- lapply(mis_tablas_path, fread)
  
  # lista de tablas con nombre
  lista_de_tablas <<- magrittr::set_names(lista_de_tablas, nombre_tablas)

}

Extraemos de la lista todos los dataframes y los cargamos en el Enviroment.

Limpiamos todo el el entrono y nos quedamos únicamente con los datos que nos itersan.

# Obtenmeos los dataframe en el Environment
for (i in names(lista_de_tablas)) {
  assign(paste0("df_", i), lista_de_tablas[[i]])
}

# Limpiar entorno
no_limpiar <- c(paste0("df_", nombre_tablas),'lista_de_tablas', 'fun_na_df', 'fun_na_lista')
rm(list = setdiff(ls(), no_limpiar));graphics.off();globalenv();cat("\014")

Tratamiento NAs

Verificaremos que dataframes tienen NAs y los imputaremos a la media, y de nuevo limpiamos el entorno.

Cargar función

# Comprobamos los dataframe con NA ----
dataframes_NA <- fun_na_lista(lista_de_tablas)
dataframes_NA
## $PF_rrss
##           semana rrss_impresiones   rrss_inversion 
##                0                0                0 
## 
## $PF_sales
##   mes sales 
##     0     0 
## 
## $PF_sem
##        semana    sem_clicks sem_inversion 
##             0             0             0 
## 
## $PF_tv
##          mes tv_inversion 
##            2            2
# Imputar los NA a la media en el dataframe df_PF_tv
df_PF_tv <- df_PF_tv %>% replace_na( list(
    tv_inversion = mean(na.omit(df_PF_tv$tv_inversion)) # imputar a la media
  ))

# Limpiar entorno ----
no_limpiar <- c("df_PF_rrss", "df_PF_sales", "df_PF_sem", "df_PF_tv")
rm(list = setdiff(ls(), no_limpiar));graphics.off();globalenv();cat("\014")

Ver función

# Funciones para localizar NA en dataframe y en lista

# Función encontrar Na en dataframe 
fun_na_df <- function(dataframe){
  sapply(dataframe, function(x) sum(is.na(dataframe)))
}

# Función encontrar Na en lista de dataframes
fun_na_lista <- function(lista_df){
  lista_df_NA <- lapply( X = lista_df , FUN = fun_na_df )
  return(lista_df_NA)
}

Unión de dataframes

Uniremos los cuatro dataframes en un mismo dataframe, usando granularidad mensual y nos quedamos únicamente con el periodo de fechas coincidente.

Tratamiento de variables para los 4 dataframes

  1. Damos formato a las fechas

  2. Ordenamos las fechas

  3. Pasamos de semenas a meses, agrupamos por meses el df_PF_rrss y df_PF_sem

df_PF_rrss <- df_PF_rrss %>% 
  mutate(semana = as.Date(semana, format="%d/%m/%Y")) %>% 
  arrange(semana) %>% 
  mutate(mes = floor_date(semana, unit='month')) %>% 
  group_by(mes) %>%
  summarise(rrss_impresiones = sum(rrss_impresiones), 
            rrss_inversion = sum(rrss_inversion))

df_PF_sales <- df_PF_sales %>% 
  mutate(mes = as.Date(mes, format="%d/%m/%Y")) %>% 
  arrange(mes) 

df_PF_sem <- df_PF_sem %>% 
  mutate(semana = as.Date(semana, format="%d/%m/%Y")) %>% 
  arrange(semana) %>% 
  mutate(mes = floor_date(semana, unit='month')) %>% 
  group_by(mes) %>%
  summarise(sem_clicks = sum(sem_clicks), 
            sem_inversion = sum(sem_inversion))

df_PF_tv <- df_PF_tv %>% 
  mutate(mes = as.Date(mes, format="%d/%m/%Y")) %>% 
  arrange(mes)

Comprobamos fechas de los dataframes

# Comprobamos el rango de fechas de los dataframes
data.frame(
  dataframe = c("df_PF_rrss", "df_PF_sales", "df_PF_sem", "df_PF_tv"),
  fecha_minima = c(min(df_PF_rrss$mes),
                   min(df_PF_sales$mes),
                   min(df_PF_sem$mes),
                   min(df_PF_tv$mes)),
  fecha_máxima = c(max(df_PF_rrss$mes),
                   max(df_PF_sales$mes),
                   max(df_PF_sem$mes),
                   max(df_PF_tv$mes))
) %>% reactable()

Unimos todos los dataframes

df <- df_PF_rrss %>% 
  inner_join(df_PF_sales, by = "mes") %>% 
  inner_join(df_PF_sem, by = "mes") %>% 
  inner_join(df_PF_tv, by = "mes")

El resultado lo podemos ver en esta tabla interactiva:

Tabla interactiva de medios
Impresiones | Ventas | Clicks

Comprobamos las fechas en el nuevo df

data.frame(
  dataframe = "df",
  fecha_minima = min(df$mes),
  fecha_máxima = max(df$mes)
) %>% reactable()

# Limpiar entorno ----
no_limpiar <- "df"
rm(list = setdiff(ls(), no_limpiar));graphics.off();globalenv();cat("\014")

Análisis de datos

Obtenemos una tabla con la inversión de cada medio en cada año, descartando 2015 y 2019, (dado que no están completos).

df_inversiones <- df %>% 
  mutate(anio = year(mes)) %>% 
  filter(anio !=2015 & anio !=2019) %>% 
  group_by(anio) %>% 
  summarise(rrss_inversion = sum(rrss_inversion),
            sem_inversion = sum(sem_inversion),
            tv_inversion = sum(tv_inversion)) 
Inversión en medios
RRSS | SEM | TV

Construimos una tabla que muestre la venta media de cada mes, descartando también 2015 y 2019.

df_ventas <- df %>% 
  mutate(meses = month(mes, label = T, abbr = F)) %>% 
  mutate(anio = year(mes)) %>% 
  filter(anio !=2015 & anio !=2019) %>% 
  group_by(anio, meses) %>% 
  summarise(media_ventas = mean(sales))
Venta media de cada mes
2016 | 2017 | 2018

Visualizamos la serie por meses de cada año para ver si existe estacionalidad.

plotly::plot_ly(data =  df_ventas , 
        x = ~meses, y = ~ media_ventas, 
        type="scatter", 
        mode='lines',
        name = ~anio,
        line = list(color = c('#048EE8','#000FFF','#FFF000'), 
                    width = 2)) %>% 
plotly::layout(title = 'Ventas por meses y por años')

Hemos separado la serie de ventas por cada año para ver mejor la estacionalidad de las ventas. Y como claramente el mes de Junio hay un gran descenso en las ventas, mientras que los meses invernales son los que registran mayores ventas.

Correlación de cada variable de medios con la venta

df_correlacion <- df %>% 
  select(!1) %>% 
  cor() %>% 
  as.data.frame() %>% 
  dplyr::slice(3:3) %>% 
  round(2)
Correlación Ventas
rrss impresiones | rrss inversion | sem clicks | sem inversion | tv inversion

Claramente la variable inversión TV es la que mayor correlación guarda guarda con las ventas

Title

Developed by: Aaron Benchiheub Pérez

aaronbenchiheubperez@gmail.com